"""
提取指定时间点的帧
"""
import cv2
import os

def extract_frame_at_time(video_path, output_folder, target_seconds):
    """
    提取视频中指定时间点的帧。

    :param video_path: 输入视频文件的路径。
    :param output_folder: 保存帧图片的输出文件夹路径。
    :param target_seconds: 目标时间点（秒），可以是浮点数，例如 2.5。
    """
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)

    cap = cv2.VideoCapture(video_path)

    if not cap.isOpened():
        print(f"错误：无法打开视频文件 {video_path}")
        return

    fps = cap.get(cv2.CAP_PROP_FPS)
    total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
    video_duration = total_frames / fps

    if target_seconds < 0 or target_seconds > video_duration:
        print(f"错误：指定的时间 {target_seconds}s 超出了视频时长 {video_duration:.2f}s。")
        cap.release()
        return

    # 计算目标时间点对应的帧索引
    target_frame_index = int(target_seconds * fps)

    print(f"视频帧率: {fps}")
    print(f"目标时间 {target_seconds}s 对应的帧索引约为: {target_frame_index}")
    print(f"开始定位并提取帧...")

    # 使用 set(cv2.CAP_PROP_POS_FRAMES, ...) 直接跳转到目标帧
    # 注意：这是一个提示性的跳转，不一定每次都能精确落在目标帧上，尤其是在使用某些压缩编码时
    cap.set(cv2.CAP_PROP_POS_FRAMES, target_frame_index)

    ret, frame = cap.read()

    if ret:
        output_filename = os.path.join(output_folder, f"frame_at_{target_seconds}s.jpg")
        cv2.imwrite(output_filename, frame)
        print(f"成功提取时间点 {target_seconds}s 的帧，并保存为 '{output_filename}'。")

        # 可选：显示一下提取到的帧
        cv2.imshow(f"Frame at {target_seconds}s", frame)
        cv2.waitKey(0) # 等待按键关闭窗口
        cv2.destroyAllWindows()
    else:
        print(f"无法提取时间点 {target_seconds}s 的帧。")

    cap.release()

# --- 使用示例 ---
if __name__ == "__main__":
    input_video_path = mp4
    output_frames_folder = "extracted_frames_time"

    # 提取第 1.5 秒的帧
    # time_to_extract = 1.2
    # extract_frame_at_time(input_video_path, output_frames_folder, time_to_extract)

    # 可以循环调用以提取多个时间点
    times_to_extract = [1.0, 3.5, 5.0]
    for t in times_to_extract:
        extract_frame_at_time(input_video_path, output_frames_folder, t)